'use strict';
/**
 * 公共接口
 * 此云对象内的所有函数默认不需要登录即可访问
 */
var vk; // 全局vk实例
// 涉及的表名

const dbName = require("../../dao/config.js");

var db = uniCloud.database(); // 全局数据库引用
var _ = db.command; // 数据库操作符
var $ = _.aggregate; // 聚合查询操作符
/**
 * 权限注意：
 * pub_ 开头的函数不需要登录即可访问 如：pub_getList
 * kh_ 开头的函数需要登录才能访问 如：kh_getList
 * sys_ 开头的函数需要授权指定权限才能访问 如：sys_getList
 * _ 开头的函数禁止前端访问 如：_before
 * 其他函数 默认均需要登录才能访问 如：getList（若将云对象文件放在pub目录下，则默认其他函数不需要登录即可访问，若放在sys目录下，则默认其他函数需要授权才能访问）
 */
var cloudObject = {
	isCloudObject: true, // 标记为云对象模式
	/**
	 * 请求前处理，主要用于调用方法之前进行预处理，一般用于拦截器、统一的身份验证、参数校验、定义全局对象等。
	 */
	_before: async function() {
		vk = this.vk; // 将vk定义为全局对象
		// let { customUtil, uniID, config, pubFun } = this.getUtil(); // 获取工具包
	},
	/**
	 * 请求后处理，主要用于处理本次调用方法的返回结果或者抛出的错误
	 */
	_after: async function(obj) {
		let { err, res } = obj;
		if (err) {
			return; // 如果方法抛出错误，直接return;不处理
		}
		return res;
	},
	/**
	 * 获取商家信息
	 * @url client/pub.getMchInfo 前端调用的url参数地址
	 */
	getMchInfo: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		res.mchInfo = await vk.daoCenter.mchDao.find();
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取商家用户登录注册协议
	 * @url client/pub.getLoginAgreement 前端调用的url参数地址
	 */
	getLoginAgreement: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let mchInfo = await vk.daoCenter.mchDao.find();
		res.login_agreement = mchInfo.login_agreement;
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取首页公告数据
	 * @url client/pub.getIndexNotice 前端调用的url参数地址
	 */
	getIndexNotice: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let { ids, name } = data;

		// 获取最新3条公告
		res = await vk.baseDao.select({
			dbName: dbName.notice,
			pageIndex: 1,
			pageSize: 3,
			whereJson: {
				status: 1
			},
			sortArr: [{ "name": "sort", "type": "desc" }, { "name": "_add_time", "type": "desc" }]
		});

		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取公告列表
	 * @url client/pub.getNoticeList 前端调用的url参数地址
	 */
	getNoticeList: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		res = await vk.baseDao.getTableData({
			dbName: dbName.notice,
			data,
			whereJson: {
				status: 1
			},
			sortArr: [{ "name": "sort", "type": "desc" }, { "name": "_add_time", "type": "desc" }]
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取公告详情
	 * @url client/pub.getNoticeInfo 前端调用的url参数地址
	 */
	getNoticeInfo: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let { _id, is_view } = data;
		if (vk.pubfn.isNull(_id)) return { code: -1, msg: "id不能为空" };
		if (is_view) {
			// 阅读数+1,并查询
			res.info = await vk.baseDao.updateAndReturn({
				dbName: dbName.notice,
				whereJson: {
					_id: _id
				},
				dataJson: {
					view_count: _.inc(1)
				}
			});
		} else {
			// 普通查询
			res.info = await vk.baseDao.findById({
				dbName: dbName.notice,
				id: _id,
			});
		}
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取分类列表,同时获取第一个分类下的商品100个
	 * @url client/pub.getCategoryIndexShow 前端调用的url参数地址
	 */
	getCategoryIndexShow: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			goodsPageSize = 20
		} = data;
		res.categoryList = await vk.baseDao.select({
			dbName: dbName.category,
			pageIndex: 1,
			pageSize: 500,
			getMain: true,
			whereJson: {
				is_index_show: true
			},
			sortArr: [{ "name": "sort", "type": "asc" }],
		});
		if (vk.pubfn.isNull(res.categoryList)) {
			return res;
		}
		res.firstCategoryId = res.categoryList[0]._id;

		res.categoryList[0].goodsList = await vk.daoCenter.goodsDao.selects({
			pageIndex: 1,
			pageSize: goodsPageSize,
			getMain: true,
			whereJson: {
				status: 1,
				category_ids: res.firstCategoryId
			},
			sortArr: [{ "name": "sort", "type": "desc" }],
			foreignDB: [
				{
					dbName: dbName.sku,
					localKey: "_id",
					foreignKey: "goods_id",
					as: "sku_list",
					limit: 100
				}
			]
		});

		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取商品列表
	 * @url client/pub.getGoodsList 前端调用的url参数地址
	 */
	getGoodsList: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let { formData = {} } = data;
		let {
			coupon_id
		} = formData;
		let whereJson = {};
		if (vk.pubfn.isNotNull(coupon_id)) {
			let couponInfo = await vk.daoCenter.mallCouponDao.findById(coupon_id);
			if (vk.pubfn.isNull(couponInfo)) return { code: -1, msg: '优惠券不存在' };
			let { available_range_rule } = couponInfo;
			if (available_range_rule.type == 1) {
				if (vk.pubfn.isNotNull(available_range_rule.category_ids)) {
					whereJson["category_ids"] = _.in(available_range_rule.category_ids);
				}
				if (vk.pubfn.isNotNull(available_range_rule.goods_ids)) {
					whereJson["_id"] = _.in(available_range_rule.goods_ids);
				}
			} else if (available_range_rule.type == 2) {
				if (vk.pubfn.isNotNull(available_range_rule.category_ids)) {
					whereJson["category_ids"] = _.nin(available_range_rule.category_ids);
				}
				if (vk.pubfn.isNotNull(available_range_rule.goods_ids)) {
					whereJson["_id"] = _.nin(available_range_rule.goods_ids);
				}
			}
		}
		res = await vk.daoCenter.goodsDao.getTableData({
			data,
			whereJson: {
				status: 1,
				is_on_sale: true
			},
			sortArr: [{ "name": "sort", "type": "desc" }],
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取商品详情
	 * @url client/pub.getGoodsInfo 前端调用的url参数地址
	 */
	getGoodsInfo: async function(data) {
		let res = { code: 0, msg: '' };
		let { uid } = this.getClientInfo();
		// 业务逻辑开始-----------------------------------------------------------
		let { _id } = data;
		if (vk.pubfn.isNull(_id)) return { code: -1, msg: "id不能为空" };
		res.info = await vk.daoCenter.goodsDao.findInfo(_id);
		if (!res.info) return { code: -1, msg: "商品不存在" };
		if (uid) {
			// 查询我是否收藏了此商品
			let count = await vk.daoCenter.userCollectDao.count({
				user_id: uid,
				goods_id: _id
			});
			res.isCollect = count > 0 ? true : false;
		}
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取商品评价列表
	 * @url client/pub.getGoodsCommentList 前端调用的url参数地址
	 */
	getGoodsCommentList: async function(data) {
		let res = { code: 0, msg: '' };
		let { uid } = this.getClientInfo();
		// 业务逻辑开始-----------------------------------------------------------
		res = await vk.daoCenter.goodsCommentDao.getTableData({
			data,
			whereJson: _.or([{
					status: _.in([0, 1]),
					user_id: uid
				},
				{
					status: 1
				}
			])
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 批量获取动态组件信息(最多一次性获取500)
	 * @url client/pub.getComponentsList 前端调用的url参数地址
	 */
	getComponentsList: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let { ids, name } = data;
		if (vk.pubfn.isNullAll(ids, name)) return { code: -1, msg: "ids和name不能都为空" };
		let whereJson = {};
		if (vk.pubfn.isNotNull(name)) {
			whereJson["name"] = name;
		}
		if (vk.pubfn.isNotNull(ids)) {
			if (!vk.pubfn.isArray(ids)) return { code: -1, msg: "ids格式错误" };
			whereJson["data_id"] = _.in(ids);
		}
		let list = await vk.baseDao.select({
			dbName: dbName.components,
			pageIndex: 1,
			pageSize: 500,
			getMain: true,
			whereJson,
			sortArr: [{ name: "sort", type: "asc" }]
		});
		res.list = list;
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取公众号的appid
	 * @url client/pub.getH5WeixinAppId 前端调用的url参数地址
	 */
	getH5WeixinAppId: async function(data) {
		let { config } = this.getUtil(); // 获取工具包
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let appid = vk.pubfn.getUniIdConfig(config, "h5-weixin.oauth.weixin.appid");
		res.appid = appid;
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 根据我的位置，获取附近的门店列表
	 * @url client/pub.getShopList 前端调用的url参数地址
	 */
	getShopList: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			location,
			maxDistance,
		} = data;
		let whereJson = {
			status: 0
		};
		let geometry;
		try {
			whereJson["location"] = _.geoNear({
				geometry: new db.Geo.Point(location.longitude, location.latitude), // 点的地理位置,为了方便测试,这里固定在杭州市西湖区
				maxDistance, // 选填，最大距离，米为单位
				minDistance: 0, // 选填，最小距离，米为单位
				distanceMultiplier: 0.001, // 返回时在距离上乘以该数字 1代表米 100 代表厘米 0.001 代表千米
				distanceField: "distance", // 输出的每个记录中 distance 即是与给定点的距离
			});
		} catch (err) {}
		res = await vk.daoCenter.mchShopDao.getTableData({
			data,
			whereJson
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
};

module.exports = cloudObject;
